home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / C and C++ / Libraries / BlobMgr / Demo Folder / Far.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-02-21  |  4.1 KB  |  228 lines  |  [TEXT/KAHL]

  1. /*
  2.  * Blob Manager Demonstration:  Fifteen-A-Row module
  3.  *    
  4.  * 25 June 1986    Paul DuBois
  5.  *
  6.  * 30 Dec 93
  7.  * - Converted blobs from picture blobs to procedure blobs.
  8.  */
  9.  
  10. # include    "TransSkel.h"
  11.  
  12. # include    "BlobMgr.h"
  13. # include    "BlobDemo.h"
  14.  
  15.  
  16. # define    xMid    145
  17. # define    yMid    100
  18. # define    radius    10
  19.  
  20.  
  21. static WindowPtr        wind;
  22. static BlobSetHandle    donors;
  23. static BlobSetHandle    receptors;
  24.  
  25. static Boolean            wait = false;
  26. static ControlHandle    restartCtl;
  27.  
  28.  
  29. static void
  30. TestAnswer (void)
  31. {
  32. BlobHandle    b, b2;
  33. short        i;
  34.  
  35.     for (i = 0; i < 9; ++i)
  36.     {
  37.         b = GetBlobHandle (receptors, i);
  38.         if ((**b).glob == nil) return;
  39.     }
  40.     b = GetBlobHandle (receptors, 0);
  41.     if (GetBRefCon ((**b).glob) != 5L) return;
  42.     for (i = 1; i < 5; i++)
  43.     {
  44.         b = GetBlobHandle (receptors, i);
  45.         b2 = GetBlobHandle (receptors, i + 4);
  46.         if (GetBRefCon ((**b).glob) + GetBRefCon ((**b2).glob) != 10L)
  47.                 return;
  48.     }
  49.     wait = true;
  50.     FreezeBlobSet (receptors);
  51.     HiliteControl (restartCtl, normalHilite);
  52. }
  53.  
  54.  
  55. static void
  56. DoLine (short x, short y)
  57. {
  58.     MoveTo (xMid, yMid);
  59.     LineTo (xMid + x, yMid + y);
  60. }
  61.  
  62.  
  63. static void
  64. DoLines (void)
  65. {
  66.     DoLine (-50, 0);
  67.     DoLine (-35, -35);
  68.     DoLine (0, -50);
  69.     DoLine (35, -35);
  70.     DoLine (50, 0);
  71.     DoLine (35, 35);
  72.     DoLine (0, 50);
  73.     DoLine (-35, 35);
  74. }
  75.  
  76.  
  77. /*
  78.  * Draw donor or receptor blob.  Both have empty static region, so partCode
  79.  * is always inDragBlob.
  80.  */
  81.  
  82. static pascal void
  83. DrawDonor (BlobHandle bDst, BlobHandle bSrc, short partCode)
  84. {
  85. Rect    r;
  86.  
  87.     r = BDragBox (bDst);
  88.     EraseOval (&r);
  89.     FrameOval (&r);
  90.     MoveTo (r.left + 6, r.bottom - 6);
  91.     DrawChar ((char) (GetBRefCon (bSrc) + '0'));
  92. }
  93.  
  94. static pascal void
  95. DrawReceptor (BlobHandle bDst, BlobHandle bSrc, short partCode)
  96. {
  97. Rect    r;
  98.  
  99.     r = BDragBox (bDst);
  100.     PenSize (2, 2);
  101.     EraseOval (&r);
  102.     FrameOval (&r);
  103.     PenSize (1, 1);
  104. }
  105.  
  106.  
  107. /*
  108.  * Make donor and receptor blobs.
  109.  *
  110.  * Donor reference constant is the number to be drawn in the blob's static
  111.  * region.
  112.  */
  113.  
  114. static void
  115. NewDonor (short val)
  116. {
  117. BlobHandle    b;
  118. short        diameter;
  119. Rect        r;
  120.  
  121.     b = NewBlob (donors, true, 1, false, (long) val);
  122.     diameter = radius + radius;
  123.     SetRect (&r, 0, 0, diameter, diameter);
  124.     OffsetRect (&r, (short) (val * (diameter + 6) + 5), 10);
  125.     SetProcRectBlob (b, DrawDonor, &r, &r);
  126. }
  127.  
  128.  
  129. static void
  130. NewReceptor (short x, short y)
  131. {
  132. BlobHandle    b;
  133. short        diameter;
  134. Rect        r;
  135.  
  136.     b = NewBlob (receptors, true, 1, false, 0L);
  137.     diameter = radius + radius;
  138.     SetRect (&r, 0, 0, diameter, diameter);
  139.     OffsetRect (&r, xMid + x - radius, yMid + y - radius);
  140.     SetProcRectBlob (b, DrawReceptor, &r, &r);
  141. }
  142.  
  143.  
  144. static pascal void
  145. Mouse (Point pt, long t, short mods)
  146. {
  147. ControlHandle    ctl;
  148.  
  149.     if (FindControl (pt, wind, &ctl))
  150.     {
  151.         if (TrackControl (ctl, pt, nil))
  152.         {
  153.             HiliteControl (restartCtl, dimHilite);
  154.             wait = false;
  155.             ThawBlobSet (receptors);
  156.             ZUnglueGlobSet (receptors);
  157.             SkelPause (60L);
  158.             InvalRect (&wind->portRect);
  159.             ShuffleBlobSet (donors);
  160.             ValidRect (&wind->portRect);    /* avoid update event */
  161.         }
  162.     }
  163.     else
  164.     {
  165.         BlobClick (pt, t, donors, receptors);
  166.         TestAnswer ();
  167.     }
  168. }
  169.  
  170.  
  171. static pascal void
  172. Update (Boolean resized)
  173. {
  174.     DrawControls (wind);
  175.     DoLines ();
  176.     DrawBlobSet (receptors);
  177.     DrawBlobSet (donors);
  178. }
  179.  
  180.  
  181. static pascal void
  182. Activate (Boolean active)
  183. {
  184.     if (active)
  185.     {
  186.         SetDragRects (wind);
  187.         SetBCPermissions (true, true, false, true, true);
  188.     }
  189. }
  190.  
  191.  
  192. void
  193. FarInit (void)
  194. {
  195. short    i;
  196. Rect    r;
  197.  
  198.     SkelWindow (wind = GetDemoWind (farWindRes),
  199.                 Mouse,            /* mouse clicks */
  200.                 nil,            /* key clicks */
  201.                 Update,            /* updates */
  202.                 Activate,        /* activate/deactivate events */
  203.                 nil,            /* close window */
  204.                 DoWClobber,        /* dispose of window */
  205.                 nil,            /* idle proc */
  206.                 false);            /* irrelevant, since no idle proc */
  207.  
  208.     donors = NewBlobSet ();
  209.     receptors = NewBlobSet ();
  210.     NewReceptor (0, 0);  /* middle point */
  211.     NewReceptor (-50, 0);
  212.     NewReceptor (-35, -35);
  213.     NewReceptor (0, -50);
  214.     NewReceptor (35, -35);
  215.     NewReceptor (50, 0);
  216.     NewReceptor (35, 35);
  217.     NewReceptor (0, 50);
  218.     NewReceptor (-35, 35);
  219.     for (i = 0; i < 9; ++i)
  220.         NewDonor (i+1);
  221.     SetRect (&r, 20, 160, 100, 180);
  222.     restartCtl = NewControl (wind, &r, "\pRestart", true, 0, 0, 0,
  223.                                 pushButProc, 0L);
  224.     HiliteControl (restartCtl, dimHilite);
  225.  
  226.     MakeFrontWind (wind);
  227. }
  228.